//
//  main.m
//  OC08_Category_Extension_Protocol
//
//  Created by Scott on 16/3/5.
//  Copyright © 2016年 Scott. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "NSString+FirstCharactor.h"
#import "Contect.h"
#import "Addbook.h"
#import "Person.h"
#import "Girl.h"
#import "Boy.h"
#import "Mother.h"
#import "Nurse.h"

/** 知识点: category */
void chapterOfCategory() {
    
    // 用途1: 对没有源码的类(如系统类)扩展方法.
    
    // 需求, NSString类, 扩展一个方法, 实现获取首字母并且转换为大写.
    NSString *str = @"zhangsan";
    
    NSString *first = [str getFirstCharactor];
    NSLog(@"first:%@", first);
    
    // 用途2: 本身的含义, 把API进行分类, 便于查看.
    

}

/** 知识点: extension(延展). */
void chapterOfExtension() {
    
    // 用途: 私有化API(属性, 方法)
    Addbook *ab = [[Addbook alloc] init];
    
    Contect *con1 = [[Contect alloc] init];
    Contect *con2 = [[Contect alloc] init];
    
    [ab addContact:con1];
    [ab addContact:con2];
    
    [ab showAllContact];
    
    Person *per = [[Person alloc] init];
    NSLog(@"per:%@", per);
    
    [ab deleteContactWithName:@"Tom"];
    

}

/** 知识点: protocol, delegate. */
void chapterOfProtocelDelegate() {
    
    // 需求: 男孩, 女孩结婚的例子.
    // 女孩写协议
    // 男孩遵循协议
    // 男孩实现协议方法
    // 女孩在适当的时机(方法)中, 让代理人(男孩)调用协议方法.
    
    Girl *lili = [[Girl alloc] init];
    lili.name = @"Lili";
    
    Boy *tom = [[Boy alloc] init];
    tom.name = @"Tom";
    
    lili.delegate = tom;
    
    [lili marry];
    
    
    // 需求: 母亲类, 保姆类
    // 母亲类 定义协议
    // 保姆类 遵循协议, 实现协议方法.
    // 在恰当的时机(方法), 母亲类让delegate代用协议方法.
    
    Mother *mo = [[Mother alloc] init];
    mo.name = @"xiaohong";
    
    Nurse *nur = [[Nurse alloc] init];
    nur.name = @"xiaoli";
    
    mo.delegate = nur;
    
    [mo payMoney];
    
    
}

/** 限时代码. */
void limitTimeCoded() {
    
    
}

/** 阅读资料. */
void resource() {
    
    
}

#pragma mark - MAIN FUNCTION
int main(int argc, const char * argv[]) {

#pragma mark - 知识点1: Category (类目)
    chapterOfCategory();
    
#pragma mark - 知识点2: Extension (延展)
    chapterOfExtension();
    
#pragma mark - 知识点3: Protocol , delegate
    chapterOfProtocelDelegate();
    
#pragma mark - 限时代码.
    limitTimeCoded();
    
#pragma mark - 阅读资料.
    resource();
    
    return 0;
}
